#pragma once
#include <iostream>
#include <memory>
#include <stdio.h>
#ifdef __linux__
#include <unistd.h>
#endif
#include "util.hpp"
#include "level.hpp"
#include "logMes.hpp"
#include "format.hpp"
#include "sink.hpp"
#include "sock.hpp"
#include "logger.hpp"
/*
为了更好的用户体验，我们可以在进行一层封装
1. 封装一个全局函数，专门用来获取日志器;
2. 封装一个全局函数，专门用来获取默认日志器

封装一层日志输出宏
预期:logger->debug(fmt,....); 也就是不用我们用户再自己输入__FILE__,__LINE__了


针对默认日志器单独一套输出宏

*/

namespace LoggerSpace
{
    // 获取日志器
    std::shared_ptr<Logger> getLogger(const std::string &name)
    {
        return loggerManager::getInstance().getLogger(name);
    }
    // 获取默认日志器
    std::shared_ptr<Logger> getRootLogger()
    {
        return loggerManager::getInstance().getRootLogger();
    }

// 预期使用:logger->Debug(fmt,...); 实际:logger->debug(__FILE,__LINE__,fmt,...)
#define Debug(fmt, ...) debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Info(fmt, ...) info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Warning(fmt, ...) warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Error(fmt, ...) error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Fatal(fmt, ...) fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Unknown(fmt, ...) unknown(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

// 针对默认日志器单独一套:
// 只要使用LOGD("%s",测试);//就是利用标砖输出日志器输出
#define LOGD(fmt, ...) LoggerSpace::getRootLogger()->debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOGI(fmt, ...) LoggerSpace::getRootLogger()->info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...) LoggerSpace::getRootLogger()->warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) LoggerSpace::getRootLogger()->error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOGF(fmt, ...) LoggerSpace::getRootLogger()->fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOGU(fmt, ...) LoggerSpace::getRootLogger()->unknown(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

// 针对普通日志器也一套:
// 只要使用LOG_DEBUG("sync","%s","测试...");就是使用指定日志器进行日志输出
#define LOG_DEBUG(name, fmt, ...) LoggerSpace::getLogger(name)->debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_INFO(name, fmt, ...) LoggerSpace::getLogger(name)->info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_WARN(name, fmt, ...) LoggerSpace::getLogger(name)->warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_ERROR(name, fmt, ...) LoggerSpace::getLogger(name)->error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_FATAL(name, fmt, ...) LoggerSpace::getLogger(name)->fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_UNKNOWN(name, fmt, ...) LoggerSpace::getLogger(name)->unknown(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
} // namespace MySpace
